﻿/*****************************************************************//**
 *
 * @file   FITKAbaqusAdaptorPart.h
 * @brief  Abaqus Part 适配器 用于读取INP过程中的Part解析。
 * @author fulipeng (flipengqd@yeah.net)
 * @date   2024-03-15
 *
 *********************************************************************/
#ifndef __FITKABAQUSADAPTORPART__H__
#define __FITKABAQUSADAPTORPART__H__

#include "FITKAbaqusAbstractAdaptor.h"
#include "FITK_Kernel/FITKAdaptor/FITKIOAdaptorFactory.h"

//前置声明
ForwardDeclarNS(AbaqusData, FITKAbaqusPart)
ForwardDeclarNS(AbaqusData, FITKDataCase)
ForwardDeclarNS(Interface, FITKAbaAbastractSection)
ForwardDeclarNS(Interface, FITKSectionAssign)
ForwardDeclarNS(Interface, FITKModelSet)
ForwardDeclarNS(Interface, FITKMeshSurface)

namespace IO
{
    /**
     * @brief Abaqus Part 读写适配器
     * @author fulipeng (fulipengqd@yeah.net)
     * @date 2024-03-15
     */
    class FITKAbaqusAdaptorPart : public FITKAbaqusAbstractAdaptor
    {
    public:
        explicit FITKAbaqusAdaptorPart() = default;
        ~FITKAbaqusAdaptorPart() = default;

        /**
         * @brief 获取适配器数据类型名
         * @return 适配器数据类型名
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-15
         */
        QString getAdaptorClass() override;

        /**
         * @brief 设置算例数据对象
         * @param caseData
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-15
         */
        void setCaseData(AbaqusData::FITKDataCase* caseData);

        /**
         * @brief 适配器读取
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-15
         */
        bool adaptR() override;

        /**
         * @brief 适配器写出
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-15
         */
        bool adaptW() override;

    private:
        /**
         * @brief 读取节点
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-15
         */
        bool readNode();

        /**
         * @brief 读取单元
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-15
         */
        bool readElement();

        /**
         * @brief 读取集合 可以是点集合也可以是单元集合
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-19
         */
        bool readSet();

        /**
         * @brief 读取表面 
         * @return 状态 true成功， false失败
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-03-26
         */
        bool readSurface();

        /**
         * @brief 读取 局部坐标系
         * @return 状态 true成功， false失败
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-05-28
         */
        bool readOrientation();

        /**
         * @brief 读取截面属性
         * @return 状态 true成功， false失败
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-03-27
         */
        bool readSection();

        /**
         * @brief 读取惯性特征
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-05-30
         */
        bool readInertia();

        /**
         * @brief 写出节点
         * @param partData 当前写出的part
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-18
         */
        bool writeNode(AbaqusData::FITKAbaqusPart* partData);

        /**
         * @brief 写出单元
         * @param partData 当前写出的part
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-18
         */
        bool writeElement(AbaqusData::FITKAbaqusPart* partData);

        /**
         * @brief 写出集合和表面
         * @param partData 当前写出的part
         * @return 状态 true成功， false失败
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-03-27
         */
        bool writeSetSurf(AbaqusData::FITKAbaqusPart* partData);

        /**
         * @brief 写出set 包含点集、单元集
         * @param set set数据
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-19
         */
        bool writeSet(Interface::FITKModelSet* set);

        /**
         * @brief 写出surface
         * @param partData 当前写出的part
         * @param surface surface数据
         * @return 状态 true成功， false失败
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-03-27
         */
        bool writeSurface(AbaqusData::FITKAbaqusPart* partData, Interface::FITKMeshSurface* surface);

        /**
         * @brief 写出材料方向
         * @return 状态 true成功， false失败
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-06-22
         */
        bool writeMaterialOrientation();

        /**
         * @brief 写出局部坐标系
         * @return 状态 true成功， false失败
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-06-07
         */
        bool writeOrientation();

        /**
         * @brief 写出secton的数据
         * @param partData 当前写出的part
         * @return 状态 true 成功 false 失败
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-03-24
         */
        bool writeSection(AbaqusData::FITKAbaqusPart* partData);

        /**
         * @brief 写出惯量
         * @return 状态 true成功， false失败
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-05-30
         */
        bool writeInertia();


    private:
        /**
         * @brief 算例数据
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-15
         */
        AbaqusData::FITKDataCase* _caseData{};

        /**
         * @brief 部件数据
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-15
         */
        AbaqusData::FITKAbaqusPart* _partData{};

        /**
         * @brief 写出element编号标记用于累加
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-05-30
         */
        int _writeElementId{ 0 };
    };

    Register2FITKIOAdaptorFactory(INP, AbaqusData::FITKAbaqusPart, FITKAbaqusAdaptorPart)

}

#endif